
#pragma once

#include "atr/core/types.hpp"

namespace atr {

/**
 * @brief   Namespace only for internal use of atr library
 * @details Please don't use this namespace outside the atr library. IF you
 *          REALLY need to - do it with special care.
 */
namespace __ {

/**
 * @brief   Helper class implementing apacity functionality
 * @details This is the apacity part of each container. This is separated
 *          functionality for easier imlement other containers. Default
 *          implementation
 *
 * @tparam typename ... Types sequence of container
 */
template <typename ... Types>
struct __capacity
{
    /** Indicates if container is empty */
    using empty = core::_false;
    /** Count of elements in sequence */
    using size  = core::_size_t< sizeof ... (Types) >;
};

/**
 * @brief   Helper class implementing apacity functionality
 * @details This is the apacity part of each container. This is separated
 *          functionality for easier imlement other containers. Specific case
 *          when container is empty.
 */
template <>
struct __capacity<>
{
    /** Indicates if container is empty, here: it is */
    using empty = core::_true;
    /** Count of elements in sequence, here it is zero */
    using size  = core::_size_t<0>;
};

} // namespace __
} // namespace atr